#ifndef LINUX_NETWORK_MANAGER_HPP
#define LINUX_NETWORK_MANAGER_HPP

#include <string>
#include <map>
#include "NetworkService.h"
#include "UeventListener.h"
#include "InterfaceConfig.h"

/// LinuxNetworkManager: 针对 Linux 环境的网络管理实现
class LinuxNetworkManager : public NetworkService
{
public:
    /**
     * 构造函数
     * @param listener 指向 UeventListener 的指针, 监听内核事件
     */
    LinuxNetworkManager(UeventListener* listener);

    /**
     * 虚析构: 释放资源
     */
    virtual ~LinuxNetworkManager();

    // ------------ INetworkManager 接口方法 ------------
    /**
     * 初始化网络管理器
     *  - 可在此处启动UeventListener, 或加载配置
     */
    void initialize() override;

    std::string ngetMacAddress(const std::string& ifName) override;
    /**
     * 获取当前网络状态
     *  - 可在此处查询各接口的状态, 并返回
     */

    std::string ngetIPAddr(const std::string& ifName) override;

    bool nsetIPAddr(string& ifName, string& ipv4addr, int prefixlen) override;

    bool nsetMacAddress(const std::string& ifName, const std::string& macaddress) override;

    bool nsetInterfaceStatus(const std::string& ifName, bool upDown) override;

    

    /**
     * 配置接口(UP/DOWN, MAC, IP, 路由等), 
     * 具体实现调用外部工具/脚本完成
     */
    void configureInterface(const std::string& ifName,
                            const InterfaceConfig& config) override;

    /**
     * 应用静态路由(示例: 添加/删除, 视需求可扩展)
     */
    void applyRoute(const RouteInfo& routeInfo) override;

    /**
     * 注册事件回调(最终会转交给 UeventListener)
     */
    void registerCallback(NetworkEventCallback* callback) override;

    /**
     * 注销事件回调
     */
    void unregisterCallback(NetworkEventCallback* callback) override;

    /**
     * 获取接口的当前配置信息
     */
    InterfaceConfig getInterfaceConfig(const std::string& ifName) const override;

    // ------------ 其他可扩展方法 ------------
    /**
     * 从配置文件中加载并应用接口配置(可选)
     */
    void loadConfigsFromFile(const std::string& filePath);

private:
    // 监听内核事件: 用于捕获LINK_UP/LINK_DOWN
    UeventListener* m_listener;

    // 存储各接口的最新(或默认)配置, 供查询/管理
    std::map<std::string, InterfaceConfig> m_configMap;
};

#endif // LINUX_NETWORK_MANAGER_HPP
